import { ISet } from "./types";
import ArrayList from '@/sources/ArrayList'

/**
 * 集合
 */
export default class Set<T = number> implements ISet<T> {
    private al: ArrayList<T>
    constructor() {
        this.al = new ArrayList<T>();
    }
    /**
     * 获取数量
     */
    size() {
        return this.al.size()
    }

    /**
     * 是否为空
     */
    isEmpty() {
        return this.size() === 0
    }

    /**
     * 清空集合
     */
    clear() {
        this.al.clear()
    }

    /**
     * 是否包含元素element
     * @param element 
     */
    contains(element: T) {
        this.checkElement(element)
        return this.al.contains(element)
    }   

    /**
     * 添加元素
     * @param element 
     */
    add(element: T) {
        this.checkElement(element)
        if (!this.al.contains(element)) {
            this.al.add(element)
        }
    }

    /**
     * 删除元素
     * @param element 
     */
    remove(element: T) {
        this.checkElement(element)
        const index = this.al.indexOf(element)
        index >= 0 && this.al.remove(index)
    } 

    /**
     * 遍历元素
     * @param cb 
     */
    forEach(cb: (ele: T) => void) {
        this.al.forEach((ele) => {
            cb(ele)
            return false
        })
    }
    
    /**
     * 检验元素
     * @param element 
     */
    checkElement(element: T) {
        if (element == null) throw new Error('元素不合法~~')
    }
}